package cn.iocoder.yudao.module.engine.service.userpreference;

import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.engine.model.context.EngineSessionContext;
import cn.iocoder.yudao.module.engine.model.context.UserPreferenceContext;
import cn.iocoder.yudao.module.engine.service.conn.IEngineConnectListener;
import cn.iocoder.yudao.module.resource.api.IUserPreferenceApi;
import cn.iocoder.yudao.module.resource.api.model.userpreference.UserPreferenceDTO;
import cn.iocoder.yudao.module.resource.api.model.userpreference.UserPreferenceSaveReqDTO;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

@Slf4j
@Service
public class UserPreferenceConnectionHandler implements IEngineConnectListener {
    @Resource
    private IUserPreferenceApi userPreferenceApi;

    @Override
    public void onConnected(EngineSessionContext sessionCtx) {
        if (sessionCtx.getUserPreferenceCtx() == null) {
            final UserPreferenceDTO userPreference = userPreferenceApi.getOrCreateUserPreference(sessionCtx.getUserId());
            final UserPreferenceContext ctx = BeanUtils.toBean(userPreference, UserPreferenceContext.class);
            ctx.setUserPreferenceApi(userPreferenceApi);
            sessionCtx.setUserPreferenceCtx(ctx);
            log.info("建立连接-读取或创建用户偏好设置, userId = {}, userPreferenceCtx = {}",
                    sessionCtx.getUserId(), sessionCtx.getUserPreferenceCtx());
        }
    }

    @Override
    public void onDisconnected(EngineSessionContext sessionCtx) {
        final UserPreferenceContext userPreference = sessionCtx.getUserPreferenceCtx();
        if (userPreference != null) {
            final UserPreferenceSaveReqDTO req = BeanUtils.toBean(userPreference, UserPreferenceSaveReqDTO.class);
            userPreferenceApi.updateUserPreferenceById(userPreference.getId(), req);
            log.info("断开连接-写入用户偏好设置, id = {}, userPreferenceCtx = {}",
                    userPreference.getId(), sessionCtx.getUserPreferenceCtx());
        }
    }
}
